package org.jeecgframework.boot.codegenerator;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import lombok.extern.log4j.Log4j2;

/**
 * 全新的代码生成器 3.5.1
 *
 * @author 杜正冬
 * {@code @date} 2025年03月25日 17:22
 */
@Log4j2
public class Generator {

    public static void main(String[] args) {
        try {
            // 获取项目路径
            String projectPath = System.getProperty("user.dir");

            // 数据库配置
            // 使用元数据查询的方式生成代码
            // 默认已经根据 jdbcType 来适配 java 类型，支持使用 typeConvertHandler 来转换需要映射的类型映射
            DataSourceConfig.Builder dataSourceConfigBuilder = createDataSourceConfig();

            // 使用 FastAutoGenerator 快速配置代码生成器
            FastAutoGenerator fastAutoGenerator = FastAutoGenerator.create(dataSourceConfigBuilder);

            // 配置全局信息
            configureGlobal(fastAutoGenerator, projectPath);

            // 配置包信息
            configurePackage(fastAutoGenerator);

            // 配置策略信息
            configureStrategy(fastAutoGenerator);

            // 使用 Freemarker 模板引擎
            fastAutoGenerator.templateEngine(new FreemarkerTemplateEngine());

            // 执行生成
            fastAutoGenerator.execute();

        } catch (Exception e) {
            // 使用日志框架记录异常信息
            log.error("代码生成过程中出现异常: {}", e.getMessage(), e);
        }
    }

    /**
     * 创建数据源配置
     *
     * @return 数据源配置构建器
     */
    private static DataSourceConfig.Builder createDataSourceConfig() {
        // 数据库连接配置
        return new DataSourceConfig.Builder(
                "jdbc:oracle:thin:@127.0.0.1:1521:oracle?useUnicode=true&characterEncoding=UTF-8",
                "smart",
                "ecardora"
        )
                // oracle 数据库需要指定 schema
                .schema("SMART");
    }

    /**
     * 配置全局信息
     *
     * @param fastAutoGenerator 代码生成器
     * @param projectPath       项目路径
     */
    private static void configureGlobal(FastAutoGenerator fastAutoGenerator, String projectPath) {
        fastAutoGenerator.globalConfig(builder -> {
            // 禁止打开输出目录
            builder.disableOpenDir();
            // 指定代码生成的输出目录
            builder.outputDir(projectPath + "/src/main/java");
            // 设置作者名
            builder.author("杜正冬");
            // 开启 Swagger 模式
            builder.enableSwagger();
            // 设置时间类型策略
            builder.dateType(DateType.ONLY_DATE);
            // 设置注释日期格式
            builder.commentDate("yyyy-MM-dd");
        });
    }

    /**
     * 配置包信息
     *
     * @param fastAutoGenerator 代码生成器
     */
    private static void configurePackage(FastAutoGenerator fastAutoGenerator) {
        fastAutoGenerator.packageConfig(builder -> {
            // 设置父包名
            builder.parent("org.jeecg.modules");
            // 设置父包模块名
            builder.moduleName("ecard");
            // 设置实体类包名
            builder.entity("entity");
            // 设置 Mapper 接口包名
            builder.mapper("mapper");
            // 设置 Service 接口包名
            builder.service("service");
            // 设置 Service 实现类包名
            builder.serviceImpl("service.impl");
            // 设置 Mapper XML 文件包名
            builder.xml("mappers");
            // 设置 Controller 包名
            builder.controller("controller");
        });
    }

    /**
     * 配置策略信息
     *
     * @param fastAutoGenerator 代码生成器
     */
    private static void configureStrategy(FastAutoGenerator fastAutoGenerator) {
        fastAutoGenerator.strategyConfig(builder -> {
            // 设置需要生成的表名，多个用英文逗号分隔
            builder.addInclude("smart_personnel,smart_card,smart_virtualmoney,smart_Srcdata,smart_organize,smart_dealtype,smart_machine".split(","));
//            builder.addInclude("smart_personnel".split(","));
            // 开启大写命名
            builder.enableCapitalMode();
            // 开启跳过视图
            builder.enableSkipView();
            // 禁用 SQL 过滤
            builder.disableSqlFilter();
            // 启用 schema
            builder.enableSchema();

            // 实体策略配置
            builder.entityBuilder()
                    .enableActiveRecord()
                    .enableFileOverride() // 覆盖已生成文件
                    .formatFileName("%sEntity") // 设置实体类文件名
                    .enableLombok() // 启用 Lombok
                    .enableTableFieldAnnotation(); // 启用字段注解

            // mapper 策略配置
            builder.mapperBuilder()
                    .enableFileOverride() // 覆盖已生成文件
                    .enableMapperAnnotation() // 开启 @Mapper 注解
                    .enableBaseResultMap() // 启用 BaseResultMap 生成
                    .enableBaseColumnList() // 启用 BaseColumnList
                    .formatMapperFileName("%sMapper") // 格式化 Mapper 文件名称
                    .formatXmlFileName("%sXml"); // 格式化 Mapper XML 实现类文件名称

            // service 策略配置
            builder.serviceBuilder()
                    .enableFileOverride() // 覆盖已生成文件
                    .formatServiceFileName("%sService") // 设置 service 文件名
                    .formatServiceImplFileName("%sServiceImpl"); // 格式化 Service 实现类文件名称

            // Controller 策略配置
            builder.controllerBuilder()
//                    .enableHyphenStyle() // 开启驼峰转连字符
                    .formatFileName("%sController") // 设置接口 Controller 文件名
                    .enableRestStyle(); // 启用 REST 风格
        });
    }
}    